/**
 * Copyright 2018-2019 jianggujin (www.jianggujin.com).
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *      http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
package com.jianggujin.modulelink.magager;

import java.util.Set;

import com.jianggujin.modulelink.config.JMultiVersionModuleConfig;
import com.jianggujin.modulelink.exception.JModuleNotFoundException;
import com.jianggujin.modulelink.module.JModule;

/**
 * 多版本模块管理器
 * 
 * @author jianggujin
 *
 */
public interface JMultiVersionModuleManager extends JModuleManagerSupport<JMultiVersionModuleConfig> {
    /**
     * 根据配置加载一个模块
     *
     * @param moduleConfig 模块配置信息
     *
     * @return 加载成功的模块，可以为null，表示不处理
     */
    JModule<JMultiVersionModuleConfig> load(JMultiVersionModuleConfig moduleConfig);

    /**
     * 根据配置加载一个模块
     *
     * @param moduleConfig 模块配置信息
     * @param active       是否激活
     *
     * @return 加载成功的模块，可以为null，表示不处理
     */
    JModule<JMultiVersionModuleConfig> load(JMultiVersionModuleConfig moduleConfig, boolean active);

    /**
     * 获得指定名称的模块的指定版本
     * 
     * @param moduleName 模块名称
     * @param version    模块版本
     * @return 模块
     * @throws JModuleNotFoundException 未找到Module异常
     */
    JModule<JMultiVersionModuleConfig> getModule(String moduleName, String version);

    /**
     * 获得指定名称的模块的指定版本
     * 
     * @param moduleName 模块名称
     * @param version    模块版本
     * @return 如果模块或版本不存在则返回null
     */
    JModule<JMultiVersionModuleConfig> optModule(String moduleName, String version);

    /**
     * 设置指定模块的默认版本
     * 
     * @param moduleName 模块名称
     * @param version    模块版本
     */
    void setDefaultVersion(String moduleName, String version);

    /**
     * 获得指定模块的默认版本
     *
     * @param moduleName 模块名称
     * @return 默认的版本号
     */
    String getDefaultVersion(String moduleName);

    /**
     * 获得指定模块的默认版本
     *
     * @param moduleName 模块名称
     * @return 默认的版本号
     */
    String optDefaultVersion(String moduleName);

    /**
     * 判断是否存在指定模块版本
     * 
     * @param moduleName 模块名称
     * @param version    模块版本
     * @return 存在则返回true
     */
    boolean has(String moduleName, String version);

    /**
     * 获得指定模块版本
     * 
     * @param moduleName ，欧快名称
     * @return 指定模块版本
     * @throws JModuleNotFoundException 未找到Module异常
     */
    Set<String> getModuleVersions(String moduleName);

    /**
     * 获得指定模块版本
     * 
     * @param moduleName 模块名称
     * @return 如果模块不存在则返回null
     */
    Set<String> optModuleVersions(String moduleName);

    /**
     * 获得指定模块所有版本
     * 
     * @param moduleName 模块名称
     * @return 指定模块所有版本
     * @throws JModuleNotFoundException 未找到Module异常
     */
    Set<JModule<JMultiVersionModuleConfig>> getModules(String moduleName);

    /**
     * 获得指定模块所有版本
     * 
     * @param moduleName 模块名称
     * @return 如果模块不存在则返回null
     */
    Set<JModule<JMultiVersionModuleConfig>> optModules(String moduleName);

    /**
     * 卸载一个模块的指定版本
     * 
     * @param moduleName 模块名称
     * @param version    模块版本
     */
    void unload(String moduleName, String version);
}
